package com.example.monitoring.utils;

/**
 * 启用JMX监控的示例程序
 * 
 * @author rsz
 * @since 2024-04-13
 */
public class EnableJmxForMonitoring {

    public static void main(String[] args) throws Exception {
        System.out.println("=== JMX监控示例程序 ===");
        System.out.println("此程序已启用JMX远程连接，可以通过JMX客户端进行监控");
        System.out.println("JMX连接URL: service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
        System.out.println();
        
        // 检查是否已配置JMX参数
        boolean jmxEnabled = System.getProperty("com.sun.management.jmxremote") != null;
        if (!jmxEnabled) {
            System.out.println("警告: 未检测到JMX参数配置");
            System.out.println("请使用以下参数重新启动此程序:");
            System.out.println("java -Dcom.sun.management.jmxremote");
            System.out.println("     -Dcom.sun.management.jmxremote.port=9999");
            System.out.println("     -Dcom.sun.management.jmxremote.authenticate=false");
            System.out.println("     -Dcom.sun.management.jmxremote.ssl=false");
            System.out.println("     -Djava.rmi.server.hostname=localhost");
            System.out.println("     -cp target/classes com.example.monitoring.utils.EnableJmxForMonitoring");
            System.out.println();
            System.out.println("程序将继续运行，但可能无法通过JMX进行远程连接");
        } else {
            System.out.println("JMX参数已配置，可以通过JMX客户端进行连接");
        }
        
        System.out.println();
        System.out.println("=== 系统信息 ===");
        System.out.println("Java版本: " + System.getProperty("java.version"));
        System.out.println("操作系统: " + System.getProperty("os.name") + " " + System.getProperty("os.version"));
        System.out.println();
        
        // 持续运行，模拟被监控的应用
        System.out.println("程序正在运行中，按Ctrl+C终止...");
        System.out.println("可以使用JMX客户端(如jconsole)连接此程序进行监控");
        
        // 每5秒打印一次内存使用情况
        while (true) {
            long freeMemory = Runtime.getRuntime().freeMemory() / 1024 / 1024;
            long totalMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
            long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;
            
            System.out.printf("内存使用: %dM/%dM (最大: %dM)%n", 
                    (totalMemory - freeMemory), totalMemory, maxMemory);
            
            Thread.sleep(5000);
        }
    }
} 